//记号类型
enum SymType {
  UNDEFINED, //未定义

  OR,        //或
  AND,       //与
  RELOP,     //关系运算符
  ADDOP,     //加减
  MULOP,     //乘除
  NOT,       //非
  LP,        //左括号
  RP,        //右括号
  ID,        //标志符
  NUM,       //数
  ASSIGN,    //赋值
  LB,        //左大括号
  RB,        //右大括号
  COMMA,     //逗号
  SEMICOLON, //分号
  INT,       // int
  IF,        // if
  ELSE,      // else
  WHILE,     // while
  RETURN,    // return
  PRINTF,    // printf
  SCANF,     // scanf
};

enum AddOp {
  ADD, //加法
  SUB  //减法
};

enum MulOp {
  MUL, //乘法
  DIV, //除法
  MOD, //取余
};

//标识符类型
enum IdType {
  FUN, //函数
  VAR  //变量
};

//关系运算符类型
enum RelType {
  GT, //大于    >
  GE, //大于等于  >=
  EQ, //等于    ==
  LT, //小于    <
  LE, //小于等于  <=
  NE, //不等于  !=
  NR  //没有关系  用于优先关系表
};

typedef struct Token {
  int token_type;

  // use union?
  int int_value;
  char str_value[256];
} Token;

typedef struct Lexer {
  char code[64 * 1024];  // Max 64KB
  int code_size;
  int curr_code_pos;

  Token tokens[4096];
  int token_size;
  int curr_token_pos;

  bool has_error;
  bool is_done;
  char error_msg[1024];
} Lexer;
